package com.java复习.反射;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo1 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        // 反射-----作用：把创建对象的工作，通过配置文件来完成
//        Stu stu1 = new Stu();   // 原本应该这样创建对象
//        Stu stu2 = null;  // "com.java复习.反射.Stu"
//
        // 每个类，都有一个对应的Class对象，这个对象包含了类的全部信息
//        Class clazz = Stu.class;
//        Class clazz2 = stu2.getClass();

        // IO流读取外部文件，通过类名全路径来创建对象
        Class clazz = Class.forName("com.java复习.反射.Stu");
        Object object = clazz.newInstance();  // 相当于调用new Stu();-------调用构造方法创建对象

        Method m1 = clazz.getMethod("setName", String.class);
        m1.invoke(object,"小黑");

        Method m2 = clazz.getDeclaredMethod("setAge", int.class);  // 私有方法用getDeclaredMethod
        m2.setAccessible(true);  // 访问不了私有方法就自己给自己授权
        m2.invoke(object,23);

        Method m3 = clazz.getMethod("gettotal");
        m3.invoke(null);

        // 通过反射来调用操作字段
        Field name_field = clazz.getField("name");
        name_field.set(object,"小明");     // stu.name = "小明"

        Field age_field = clazz.getDeclaredField("age");  // 调用私有
        name_field.set(object,18);     // stu.age = 18
        age_field.setAccessible(true);


        System.out.println(object);


        /*
        1、通过反射操作构造方法，操作对象  // 构造方法
        2、反射操作方法  // 静态方法、成员方法
        3、反射操作字段  // 静态方法、
         */

    }
}
